package com.priox.sigar.dto;

import com.priox.sigar.client.dto.AgrupacionDTO;
import com.priox.sigar.util.ListUtil;
import com.priox.sigar.util.NumberUtil;

import java.math.BigDecimal;
import java.util.*;

/**
 * Created by MATRIX-JAVA on 25/1/2015.
 */
public class RepAnnosCxPDTO {

    private Long id;
    private String entidad;
    private String tabIndex;
    private String rango;
    private String rangoLabel;
    private String codigoMoneda;
    private String entidadDetalle;
    private Long agrupacionId;
    private Long checkPointId;
    private String sociedadId;
    private String grupoEmpresarialId;

    private String sociedadNombre;
    private String usuario;
    private Date fechaDocumento;
    private String tipoCategoria;
    private String responsable;
    private String agrupacionNombre;
    private String numeroDocumentoCompra;
    private String grupoEmpresarialNombre;
    private String cuentaContableId;
    private String cuentaContableNombre;
    private String acreedorRazonSocial;
    private String acreedorId;
    private String valorMayor;
    private List<RepAnnosCxPDTO> detalle = new ArrayList<RepAnnosCxPDTO>();
    private Map agrupacionMap = new HashMap();


    private BigDecimal anno1;
    private BigDecimal anno2;
    private BigDecimal anno3;
    private BigDecimal anno4;
    private BigDecimal bimestre1;
    private BigDecimal bimestre2;
    private BigDecimal bimestre3;
    private BigDecimal bimestre4;
    private BigDecimal bimestre5;
    private BigDecimal bimestre6;
    private BigDecimal trimestre1;
    private BigDecimal trimestre2;
    private BigDecimal trimestre3;
    private BigDecimal trimestre4;
    private BigDecimal semestre1;
    private BigDecimal semestre2;
    private BigDecimal cantidadAnno1;
    private BigDecimal cantidadAnno2;
    private BigDecimal cantidadAnno3;
    private BigDecimal cantidadAnno4;
    private BigDecimal cantidadBimestre1;
    private BigDecimal cantidadBimestre2;
    private BigDecimal cantidadBimestre3;
    private BigDecimal cantidadBimestre4;
    private BigDecimal cantidadBimestre5;
    private BigDecimal cantidadBimestre6;
    private BigDecimal cantidadTrimestre1;
    private BigDecimal cantidadTrimestre2;
    private BigDecimal cantidadTrimestre3;
    private BigDecimal cantidadTrimestre4;
    private BigDecimal cantidadSemestre1;
    private BigDecimal cantidadSemestre2;
    private BigDecimal cantidadTotalAnno;
    private BigDecimal totalAnno;
    private BigDecimal totalGeneral;
    private String idAgrupacionAlmacen;

    public String getIdAgrupacionAlmacen() {
        return grupoEmpresarialNombre + "-" + getSociedadId() + "-" + agrupacionNombre;
    }

    public void setIdAgrupacionAlmacen(String idAgrupacionAlmacen) {
        this.idAgrupacionAlmacen = idAgrupacionAlmacen;
    }

    public String getValorMayor() {
        return valorMayor;
    }

    public void setValorMayor(String valorMayor) {
        this.valorMayor = valorMayor;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEntidad() {
        return entidad;
    }

    public void setEntidad(String entidad) {
        this.entidad = entidad;
    }

    public BigDecimal getAnno1() {
        return anno1;
    }

    public void setAnno1(BigDecimal anno1) {
        this.anno1 = anno1;
    }

    public BigDecimal getAnno2() {
        return anno2;
    }

    public void setAnno2(BigDecimal anno2) {
        this.anno2 = anno2;
    }

    public BigDecimal getAnno3() {
        return anno3;
    }

    public void setAnno3(BigDecimal anno3) {
        this.anno3 = anno3;
    }

    public BigDecimal getAnno4() {
        return anno4;
    }

    public void setAnno4(BigDecimal anno4) {
        this.anno4 = anno4;
    }

    public BigDecimal getTotalGeneral() {
        return NumberUtil.nvlIsZero(anno1)
                .add(NumberUtil.nvlIsZero(anno2))
                .add(NumberUtil.nvlIsZero(anno3))
                .add(NumberUtil.nvlIsZero(anno4));
    }

    public BigDecimal getTotalAgrupacion() {
        Set keys = agrupacionMap.keySet();
        BigDecimal result = BigDecimal.ZERO;
        for (Object next : keys) {
            result = result.add(NumberUtil.nvlIsZero((BigDecimal) agrupacionMap.get(next)));
        }
        return result;
    }

    public BigDecimal getCantidadGeneral() {
        return NumberUtil.nvlIsZero(cantidadAnno1)
                .add(NumberUtil.nvlIsZero(cantidadAnno2))
                .add(NumberUtil.nvlIsZero(cantidadAnno3))
                .add(NumberUtil.nvlIsZero(cantidadAnno4));
    }

    public void setTotalGeneral(BigDecimal totalGeneral) {
        this.totalGeneral = totalGeneral;
    }

    public String getEntidadDetalle() {
        return entidadDetalle;
    }

    public void setEntidadDetalle(String entidadDetalle) {
        this.entidadDetalle = entidadDetalle;
    }

    public String getCodigoMoneda() {
        return codigoMoneda;
    }

    public void setCodigoMoneda(String codigoMoneda) {
        this.codigoMoneda = codigoMoneda;
    }

    public String getAgrupacionNombre() {
        return agrupacionNombre;
    }

    public void setAgrupacionNombre(String agrupacionNombre) {
        this.agrupacionNombre = agrupacionNombre;
    }

    public String getSociedadNombre() {
        return sociedadNombre;
    }

    public void setSociedadNombre(String sociedadNombre) {
        this.sociedadNombre = sociedadNombre;
    }

    public String getAcreedorRazonSocial() {
        return acreedorRazonSocial;
    }

    public void setAcreedorRazonSocial(String acreedorRazonSocial) {
        this.acreedorRazonSocial = acreedorRazonSocial;
    }

    public String getCuentaContableNombre() {
        return cuentaContableNombre;
    }

    public void setCuentaContableNombre(String cuentaContableNombre) {
        this.cuentaContableNombre = cuentaContableNombre;
    }

    public List<RepAnnosCxPDTO> getDetalle() {
        return detalle;
    }

    public void setDetalle(List<RepAnnosCxPDTO> detalle) {
        this.detalle = detalle;
    }

    public String getGrupoEmpresarialNombre() {
        return grupoEmpresarialNombre;
    }

    public void setGrupoEmpresarialNombre(String grupoEmpresarialNombre) {
        this.grupoEmpresarialNombre = grupoEmpresarialNombre;
    }

    public String getNumeroDocumentoCompra() {
        return numeroDocumentoCompra;
    }

    public void setNumeroDocumentoCompra(String numeroDocumentoCompra) {
        this.numeroDocumentoCompra = numeroDocumentoCompra;
    }

    public String getAcreedorId() {
        return acreedorId;
    }

    public void setAcreedorId(String acreedorId) {
        this.acreedorId = acreedorId;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public Date getFechaDocumento() {
        return fechaDocumento;
    }

    public void setFechaDocumento(Date fechaDocumento) {
        this.fechaDocumento = fechaDocumento;
    }

    public String getTipoCategoria() {
        return tipoCategoria;
    }

    public void setTipoCategoria(String tipoCategoria) {
        this.tipoCategoria = tipoCategoria;
    }


    public String getCuentaContableId() {
        return cuentaContableId;
    }

    public void setCuentaContableId(String cuentaContableId) {
        this.cuentaContableId = cuentaContableId;
    }

    public String getResponsable() {
        return responsable;
    }

    public void setResponsable(String responsable) {
        this.responsable = responsable;
    }

    public Long getAgrupacionId() {
        return agrupacionId;
    }

    public void setAgrupacionId(Long agrupacionId) {
        this.agrupacionId = agrupacionId;
    }

    public Long getCheckPointId() {
        return checkPointId;
    }

    public void setCheckPointId(Long checkPointId) {
        this.checkPointId = checkPointId;
    }

    public String getSociedadId() {
        return sociedadId;
    }

    public void setSociedadId(String sociedadId) {
        this.sociedadId = sociedadId;
    }

    public String getGrupoEmpresarialId() {
        return grupoEmpresarialId;
    }

    public void setGrupoEmpresarialId(String grupoEmpresarialId) {
        this.grupoEmpresarialId = grupoEmpresarialId;
    }

    public void completarIdAgrupacionAlmacen() {
        if(detalle.isEmpty()) return;
        setGrupoEmpresarialNombre(detalle.get(0).getGrupoEmpresarialNombre());
        setSociedadNombre(detalle.get(0).getSociedadNombre());
        setAgrupacionNombre(detalle.get(0).getAgrupacionNombre());
        setTipoCategoria(detalle.get(0).getTipoCategoria());
        sumarAnnos();
    }

    public void sumarAnnos() {

        setAnno1(ListUtil.sum(detalle, "anno1", null));
        setAnno2(ListUtil.sum(detalle, "anno2", null));
        setAnno3(ListUtil.sum(detalle, "anno3", null));
        setAnno4(ListUtil.sum(detalle, "anno4", null));
        setTotalGeneral(anno1.add(anno2).add(anno3).add(anno4));
    }

    public void populateTotalxAgrupacion(List<AgrupacionDTO> agrupacionList) {

        for (RepAnnosCxPDTO repAnnosCxPDTO : detalle) {
            for (AgrupacionDTO agrupacionDTO : agrupacionList) {
                if (agrupacionDTO.getAgrupacionId().equals(repAnnosCxPDTO.getAgrupacionId())) {
                    repAnnosCxPDTO.putAgrupacion(repAnnosCxPDTO.getAgrupacionId(), repAnnosCxPDTO.getTotalAnno());
                } else {
                    repAnnosCxPDTO.putAgrupacion(agrupacionDTO.getAgrupacionId(), BigDecimal.ZERO);
                }
            }
        }
        agrupacionMap=new HashMap();
        for (RepAnnosCxPDTO repAnnosCxPDTO : detalle) {
            for (AgrupacionDTO agrupacionDTO : agrupacionList) {
                if(agrupacionMap.get(agrupacionDTO.getAgrupacionId())!=null){
                    BigDecimal agrupacionTotal= (BigDecimal) agrupacionMap.get(agrupacionDTO.getAgrupacionId());
                    agrupacionMap.put(agrupacionDTO.getAgrupacionId(),
                            agrupacionTotal.add(NumberUtil.nvlIsZero((BigDecimal)repAnnosCxPDTO.getAgrupacionMap().get(agrupacionDTO.getAgrupacionId())))
                    );
                }else{
                    agrupacionMap.put(agrupacionDTO.getAgrupacionId(),
                            (NumberUtil.nvlIsZero((BigDecimal)repAnnosCxPDTO.getAgrupacionMap().get(agrupacionDTO.getAgrupacionId())))
                    );
                }
            }

        }



    }

    private void putAgrupacion(Long agrupacionId, BigDecimal totalAnno) {
        agrupacionMap.put(agrupacionId, totalAnno);

    }

    public BigDecimal getTotalAnno() {
        return totalAnno;
    }

    public void setTotalAnno(BigDecimal totalAnno) {
        this.totalAnno = totalAnno;
    }

    public Map getAgrupacionMap() {
        return agrupacionMap;
    }

    public void setAgrupacionMap(MapUtil agrupacionMap) {
        this.agrupacionMap = agrupacionMap;
    }

    public BigDecimal getBimestre1() {
        return bimestre1;
    }

    public void setBimestre1(BigDecimal bimestre1) {
        this.bimestre1 = bimestre1;
    }

    public BigDecimal getBimestre2() {
        return bimestre2;
    }

    public void setBimestre2(BigDecimal bimestre2) {
        this.bimestre2 = bimestre2;
    }

    public BigDecimal getBimestre3() {
        return bimestre3;
    }

    public void setBimestre3(BigDecimal bimestre3) {
        this.bimestre3 = bimestre3;
    }

    public BigDecimal getBimestre4() {
        return bimestre4;
    }

    public void setBimestre4(BigDecimal bimestre4) {
        this.bimestre4 = bimestre4;
    }

    public BigDecimal getBimestre5() {
        return bimestre5;
    }

    public void setBimestre5(BigDecimal bimestre5) {
        this.bimestre5 = bimestre5;
    }

    public BigDecimal getBimestre6() {
        return bimestre6;
    }

    public void setBimestre6(BigDecimal bimestre6) {
        this.bimestre6 = bimestre6;
    }

    public BigDecimal getTrimestre1() {
        return trimestre1;
    }

    public void setTrimestre1(BigDecimal trimestre1) {
        this.trimestre1 = trimestre1;
    }

    public BigDecimal getTrimestre2() {
        return trimestre2;
    }

    public void setTrimestre2(BigDecimal trimestre2) {
        this.trimestre2 = trimestre2;
    }

    public BigDecimal getTrimestre3() {
        return trimestre3;
    }

    public void setTrimestre3(BigDecimal trimestre3) {
        this.trimestre3 = trimestre3;
    }

    public BigDecimal getTrimestre4() {
        return trimestre4;
    }

    public void setTrimestre4(BigDecimal trimestre4) {
        this.trimestre4 = trimestre4;
    }

    public BigDecimal getSemestre1() {
        return semestre1;
    }

    public void setSemestre1(BigDecimal semestre1) {
        this.semestre1 = semestre1;
    }

    public BigDecimal getSemestre2() {
        return semestre2;
    }

    public void setSemestre2(BigDecimal semestre2) {
        this.semestre2 = semestre2;
    }

    public String getRango() {
        return rango;
    }

    public void setRango(String rango) {
        this.rango = rango;
    }

    public String getRangoLabel() {
        return rangoLabel;
    }

    public void setRangoLabel(String rangoLabel) {
        this.rangoLabel = rangoLabel;
    }

    public BigDecimal getCantidadAnno1() {
        return cantidadAnno1;
    }

    public void setCantidadAnno1(BigDecimal cantidadAnno1) {
        this.cantidadAnno1 = cantidadAnno1;
    }

    public BigDecimal getCantidadAnno2() {
        return cantidadAnno2;
    }

    public void setCantidadAnno2(BigDecimal cantidadAnno2) {
        this.cantidadAnno2 = cantidadAnno2;
    }

    public BigDecimal getCantidadAnno3() {
        return cantidadAnno3;
    }

    public void setCantidadAnno3(BigDecimal cantidadAnno3) {
        this.cantidadAnno3 = cantidadAnno3;
    }

    public BigDecimal getCantidadAnno4() {
        return cantidadAnno4;
    }

    public void setCantidadAnno4(BigDecimal cantidadAnno4) {
        this.cantidadAnno4 = cantidadAnno4;
    }

    public BigDecimal getCantidadBimestre1() {
        return cantidadBimestre1;
    }

    public void setCantidadBimestre1(BigDecimal cantidadBimestre1) {
        this.cantidadBimestre1 = cantidadBimestre1;
    }

    public BigDecimal getCantidadBimestre2() {
        return cantidadBimestre2;
    }

    public void setCantidadBimestre2(BigDecimal cantidadBimestre2) {
        this.cantidadBimestre2 = cantidadBimestre2;
    }

    public BigDecimal getCantidadBimestre3() {
        return cantidadBimestre3;
    }

    public void setCantidadBimestre3(BigDecimal cantidadBimestre3) {
        this.cantidadBimestre3 = cantidadBimestre3;
    }

    public BigDecimal getCantidadBimestre4() {
        return cantidadBimestre4;
    }

    public void setCantidadBimestre4(BigDecimal cantidadBimestre4) {
        this.cantidadBimestre4 = cantidadBimestre4;
    }

    public BigDecimal getCantidadBimestre5() {
        return cantidadBimestre5;
    }

    public void setCantidadBimestre5(BigDecimal cantidadBimestre5) {
        this.cantidadBimestre5 = cantidadBimestre5;
    }

    public BigDecimal getCantidadBimestre6() {
        return cantidadBimestre6;
    }

    public void setCantidadBimestre6(BigDecimal cantidadBimestre6) {
        this.cantidadBimestre6 = cantidadBimestre6;
    }

    public BigDecimal getCantidadTrimestre1() {
        return cantidadTrimestre1;
    }

    public void setCantidadTrimestre1(BigDecimal cantidadTrimestre1) {
        this.cantidadTrimestre1 = cantidadTrimestre1;
    }

    public BigDecimal getCantidadTrimestre2() {
        return cantidadTrimestre2;
    }

    public void setCantidadTrimestre2(BigDecimal cantidadTrimestre2) {
        this.cantidadTrimestre2 = cantidadTrimestre2;
    }

    public BigDecimal getCantidadTrimestre3() {
        return cantidadTrimestre3;
    }

    public void setCantidadTrimestre3(BigDecimal cantidadTrimestre3) {
        this.cantidadTrimestre3 = cantidadTrimestre3;
    }

    public BigDecimal getCantidadTrimestre4() {
        return cantidadTrimestre4;
    }

    public void setCantidadTrimestre4(BigDecimal cantidadTrimestre4) {
        this.cantidadTrimestre4 = cantidadTrimestre4;
    }

    public BigDecimal getCantidadSemestre1() {
        return cantidadSemestre1;
    }

    public void setCantidadSemestre1(BigDecimal cantidadSemestre1) {
        this.cantidadSemestre1 = cantidadSemestre1;
    }

    public BigDecimal getCantidadSemestre2() {
        return cantidadSemestre2;
    }

    public void setCantidadSemestre2(BigDecimal cantidadSemestre2) {
        this.cantidadSemestre2 = cantidadSemestre2;
    }

    public BigDecimal getCantidadTotalAnno() {
        return cantidadTotalAnno;
    }

    public void setCantidadTotalAnno(BigDecimal cantidadTotalAnno) {
        this.cantidadTotalAnno = cantidadTotalAnno;
    }

    public String getTabIndex() {
        return tabIndex;
    }

    public void setTabIndex(String tabIndex) {
        this.tabIndex = tabIndex;
    }
}
